#include "ModRunBuilder.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Builder/DirectorTangShi.h"
#include "Gof23/Gof_Builder/FoodBuilderComboA.h"
#include "Gof23/Gof_Builder/FoodBuilderComboB.h"
#include "Gof23/Gof_Builder/FoodBuilderSinChicken.h"
#include "Gof23/Gof_Builder/FoodBuilderSinDrinks.h"
#include "Gof23/Gof_Builder/FoodBuilderSinHamburger.h"
#include "Gof23/Gof_Builder/FoodBuilderSinIceCream.h"

//建造者模式的ModRun（Builder）;
ModRunBuilder::ModRunBuilder()
{
    //模式名称;
    m_strModelName = "建造者模式（Builder）;";
    //模式描述;
    m_strModelDesc = "建造者模式：将复杂对象的构建和其表示分离，使得相同的构建过程可以产生不同的表示。\r\n\r\n"
                     "建造者（Builder）模式和工厂模式的关注点不同：建造者模式注重零部件的组装过程，而工厂方法模式(抽象工厂模式、简单工厂模式)更注重零部件的创建过程，但两者可以结合使用。\r\n\r\n"
                     "以下情形可以考虑使用建造者模式：\r\n"
                     "对象的创建复杂，但是其各个部分的子对象创建算法一定。\r\n"
                     "需求变化大，构造复杂对象的子对象经常变化，但将其组合在一起的算法相对稳定。\r\n\r\n"
                     "建造者模式的优点：\r\n"
                     "将对象的创建和表示分离，客户端不需要了解具体的构建细节。\r\n"
                     "增加新的产品对象时，只需要增加其具体的建造类即可，不需要修改原来的代码，扩展方便。\r\n\r\n"
                     "产品之间差异性大，内部变化较大、较复杂时不建议使用建造者模式。\r\n"
                     ;
}

//初始化显示模式;
void ModRunBuilder::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunBuilder::GetEnum()
{
    return emModRunBuilder;
}

//运行模式;
void ModRunBuilder::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========建造者模式 start:=======" };
        std::initializer_list<QString> outListEnd{ "========建造者模式 end:=======" };
        pOutPut->OutPut(outListStart);

        std::initializer_list<QString> outDirectStart{ "//////堂食: A套餐+一个牛肉汉堡+一杯可乐 start://////" };
        std::initializer_list<QString> outDirectEnd{ "//////堂食: A套餐+一个牛肉汉堡+一杯可乐 end://////" };
        pOutPut->OutPut(outDirectStart);
        //建造者模式;
        std::initializer_list<QString> outListTangshi1{"堂食: A套餐+一个牛肉汉堡+一杯可乐"};
        //堂食A套餐+一个牛肉汉堡+一杯可口可乐;
        std::unique_ptr<DirectorTangShi> directTangShi(new DirectorTangShi());

        //构建套餐A;
        std::shared_ptr<FoodBuilderComboA> foodbuilderComboA(new FoodBuilderComboA("儿童汉堡","儿童饮料","儿童炸鸡"));
        directTangShi->directFoods(foodbuilderComboA, 1);

        //构建牛肉汉堡;
        std::shared_ptr<FoodBuilderHamburger> foodHamburgerNiu(new FoodBuilderHamburger("牛肉汉堡"));
        directTangShi->directFoods(foodHamburgerNiu, 1);

        //构建可口可乐
        std::shared_ptr<FoodBuilderDrinks> foodDrinkCoco(new FoodBuilderDrinks("可口可乐"));
        directTangShi->directFoods(foodDrinkCoco, 1);

        pOutPut->OutPut(outDirectEnd);

        //获取堂食产品;
        directTangShi->GetComboItems();

        pOutPut->OutPut(outListEnd);
    }

}

ModRunBuilder* ModRunBuilder::CreateMe()
{
    return new ModRunBuilder();
}
